package demo01Array;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:咭咭熊
 * Date:2021 - 09 - 08
 * Time:10:39
 */

/***
 * 8.数组拷贝
 *  （1）深拷贝——将对象也拷贝一份；
 *  （2）浅拷贝——拷贝技术之后，通过其中一个引用去修改其内容值，原来的数组内容发生改变，此过程就是浅拷贝；
 * 数组拷贝的4中方式：
 *   for循环；
 *   Arrays.copyOf();
 *   System.arraycopy()——拷贝速度最快：此方法是native方法——在JVM中的本地方法栈运行的就是native方法
 *   引用.clone()
 *
 * 从本质上来说，这四种拷贝方式都是浅拷贝，只不过 刚刚的数组当中存放的是简单类型；
 * 当其存储的是引用类型（即地址的时候），这四种拷贝方式就是浅拷贝；
 *
 */
public class copyArr {
    /***
     * 7.Arrays.fill()
     * @param args
     */
    public static void main7(String[] args) {
        int[] arr1 = new int[10];
        Arrays.fill(arr1,9);
        System.out.println(Arrays.toString(arr1));
    }
    /***
     *6. Arrays.equals()
     * @param args
     */
    public static void main6(String[] args) {
        int[] arr1 ={1,2,3,4,5};
        int[] arr2 = {1,2,3,4,5,6};
        System.out.println(Arrays.equals(arr1,arr2));
    }
    /***
     * 5.Arrays.copyOfRange()
     * @param args
     */
    public static void main5(String[] args) {
        int[] arr1 = {1,2,3,4,5,6};
        int[] ret = Arrays.copyOfRange(arr1,2,5);
        System.out.println(Arrays.toString(ret));
    }
    /***
     * 4.数组的拷贝方式4——引用.clone()——深拷贝
     * 克隆  这个引用   所指向的那个对象
     * 这个引用 所指向的对象   就会生成当前这个对象的副本
     *
     * @param args
     */
    public static void main4(String[] args) {
        int[] arr1= {1,2,3,4,5};
        //arr2指向了刚刚生成的那个副本
        int[] arr2 = arr1.clone();
        System.out.println(Arrays.toString(arr1));
        System.out.println("=======拷贝之后========");
        arr2[0] = 99;
        System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4, 5]
        System.out.println(Arrays.toString(arr2));//[99, 2, 3, 4, 5]

    }

    /***
     * 3.数组拷贝方式3——System.arraycopy()——深拷贝
     * System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
     *  需要拷贝的数组
     *  源数组的位置
     * 目的地数组
     * 目的之的位置
     * 长度
     *  @param args
     */
    public static void main3(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = new int[arr1.length];
        System.out.println(Arrays.toString(arr1));
        System.arraycopy(arr1,0,arr2,0,arr1.length);
        System.out.println("=======拷贝之后========");
        arr2[0] = 99;
        System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4, 5]
        System.out.println(Arrays.toString(arr2));//[99, 2, 3, 4, 5]

    }
    /***
     * 2.数组拷贝方式2：Arrays.copyOf(original,newLength)——深拷贝
     * @param args
     */
    public static void main2(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        System.out.println(Arrays.toString(arr1));
        int[] arr2 = Arrays.copyOf(arr1,arr1.length);
        System.out.println("=======拷贝之后========");
        arr2[0] = 99;
        System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4, 5]
        System.out.println(Arrays.toString(arr2));//[99, 2, 3, 4, 5]


    }
    /***
     * 1.数组的拷贝方式1：for循环——深拷贝：对拷贝之后的数组内容进行修改，不影响拷贝前的数组内容
     * @param args
     */
    public static void main1(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = new int[arr1.length];

        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        System.out.println("=========拷贝之后=======");
        arr2[0] = 99;
        System.out.println(Arrays.toString(arr1));//1,2,3,4,5
        System.out.println(Arrays.toString(arr2));//99,2,3,4,5

    }
}
